/**
 * 尝试写一段代码，演示两个线程争取资源的例子。
 * 这个例子有两个线程，都需要获得人质和自由两个资源.
 *    其中一个线程先获得人质资源，然后等待一段时间再获得自由资源。
 *    另一个线程先获得自由资源，然后等待一段时间再获得人质资源。
 *    这种特有的方式，会让它们在获得对方需要的资源之前先停顿以下，并导致永远无法获得对方持有的资源
 *    进而照成死锁
 */

use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
fn main() {
    let 人质 = Arc::new(Mutex::new(5));    
    let 自由 = Arc::new(Mutex::new(10));

    let h0=Arc::clone(&人质);
    let w0=Arc::clone(&自由);
    let 劫匪=thread::spawn(move || {      
        //线程0先获得人质资源，然后等待一段时间再获得自由资源。
        let mut _人质 = h0.lock().unwrap();        
        thread::sleep(Duration::from_millis(10));
        println!("我已经持有人质，快点让路!");
        let mut _自由 = w0.lock().unwrap();
        let 矛盾文学奖 = (*_人质) * (*_自由);
        println!("线程{:?}正在执行,得到{}", thread::current().id(), 矛盾文学奖);
    });

    let h1=Arc::clone(&人质);
    let w1=Arc::clone(&自由);
    let 警察=thread::spawn(move || {
        //线程1先获得的自由资源，然后等待一段时间再获得人质资源。
        let mut _自由 = w1.lock().unwrap();
        thread::sleep(Duration::from_millis(10));
        println!("赶紧放了人质，否则爆你狗头!");
        let mut _人质 = h1.lock().unwrap();        
        let 矛盾文学奖 = (*_人质) * (*_自由);
        println!("线程{:?}正在执行,得到{}", thread::current().id(), 矛盾文学奖);
    });

    劫匪.join().unwrap();
    警察.join().unwrap();
    
    println!("众人在围观....");
    let  _人质 = 人质.lock().unwrap();
    let  _自由 = 自由.lock().unwrap();
    let 矛盾文学奖 = (*_人质) * (*_自由);
    println!("Result: {}", 矛盾文学奖);
}